import java.util.Arrays;

public class MyArrayList {
    private int[] item;
    private int UseSize;

    private static final int CAPACITY = 1;

    //构造方法：默认容量
    public MyArrayList(){
        this.item = new int[CAPACITY];
    }

    //指定自定义容量
    public MyArrayList(int initcapacity){
        this.item = new int[ initcapacity];
    }

    // 打印顺序表，注意：该方法并不是顺序表中的方法，为了方便看测试结果给出的
    //实质：遍历数组
    public void display() {
        for (int i = 0; i < this.UseSize; i++) {
            System.out.print(this.item[i] + " ");
        }
    }
    //因为下面这个可能越界，所以咱先写一个防越界的方法
    public boolean IsFull(){
        if(this.UseSize == this.item.length){
            return true;
        }
        return false;
    }
    // 新增元素,默认在数组最后新增
    //小心越界情况
    public void add(int data) {
        if(IsFull()){
            this.item = Arrays.copyOf(this.item,2*item.length);
        }
        this.item[this.UseSize] = data;
        this.UseSize++;
    }
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        //注意pos位置是否合法！
        //可以用抛出异常来解决
        if(pos<0 || pos>this.UseSize){
            throw new posOutOfBoundsException(pos + " 位置不合法！");
            //System.out.println("位置不合法！");
            //return;
        }
        if(IsFull()){
            this.item = Arrays.copyOf(this.item,2*item.length);
        }
        //注意 要先挪动后面的数据！ 切记：从后往前挪！！
        for (int i = this.UseSize-1; i >= pos; i--) {
            this.item[i+1] = this.item[i];
        }
        //移动完，pos位置腾空，才可放数据
        this.item[pos] = data;
        this.UseSize++;
    }
    // 判定是否包含某个元素
    //注意：如果是引用类型让你判断呢？
    //此时就要用equals->返回true or false(注意区别：compareTo ->返回大于 等于 小于 0 数字）
    public boolean contains(int toFind) {
        for (int i = 0; i < this.UseSize; i++) {
            if(toFind == this.item[i]){
                return true;
            }
        }
       return false;
        }

    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.UseSize; i++) {
            if(toFind == this.item[i]){
                return i;
            }
        }
        return -1; }
    // 获取 pos 位置的元素
    public int get(int pos) {
        this.CheckPos(pos);
        return this.item[pos];
         }
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        this.CheckPos(pos);
        this.item[pos] = value;
    }

    //检查pos合法性
    public void CheckPos(int pos){
        if(pos<0 || pos >= this.UseSize){
            throw new posOutOfBoundsException(pos + " 位置不合法！");
        }
    }
    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        int index = this.indexOf(toRemove);
        if(index == -1){
            System.out.println("没有这个数据!");
            return;//注意返回！
        }
        for (int i = index; i < this.UseSize-1; i++) {
            //注意这里要写usesize-1 和 这里i从index开始 而不是toRemove
            this.item[i] = this.item[i+1];
        }
        //引用类型加一步：this.item[UseSize]=null;即最后一个对象指向要设为空
        this.UseSize--;
    }
    // 获取顺序表长度
    public int size() {
        return this.UseSize;
    }
    // 清空顺序表
    public void clear() {
        //引用类型多一部：删掉的对象指向要设为空null
        /*for (int i = 0; i < this.UseSize; i++) {
            this.item[i]=null;
        }*/
        this.UseSize = 0;
    }



}
